home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 7
/
Gekikoh Dennoh Club Vol. 7 (Japan).7z
/
Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin
/
tools
/
d
/
jlcd100.lzh
/
TNB_FSW
/
CDCLUN60.Lzh
/
CDCLUN.s
< prev
next >
Wrap
Text File
|
1996-06-12
|
9KB
|
472 lines
.include TNB.MAC
.include IOCSCALL.MAC
.include DOSCALL.MAC
.include CDC.MAC
HEAD1 = 'CDCL'
HEAD2 = 'N060'
StartStatio:*******************常駐部
SS:
.dc.l -1
.dc.w $8000.w
.dc.l STRR
.dc.l ETYP
dhead: .dc.l HEAD1,HEAD2
STRA5: .dc.l $0.l
STRR: move.l a5,STRA5
rts
ETYP:
movem.l d0/a5,-(a7)
movea.l STRA5(pc),a5
bsr ETYPSUB
move.b d0,$3(a5)
lsr.w #8,d0
move.b d0,$4(a5)
movem.l (a7)+,d0/a5
rts
ETYPSUB:
tst.b $2(a5)
beq ETYP_KEEP
move.w #$5003,d0 *err
rts
*********************************************
head:
.dc.l HEAD1
.dc.l HEAD2
.even
SCALL: *=========================================
* ($1F5)
* SCSI IOCS
*
SCALL__ = $1F5
SCALL_ = $07D4.w
tst.l ID * ID はセットされている?
bpl @f
_CDC_CHK_S
beq SCALL_EE * CDC.xが常駐していない
CDC _CDC_VERSION
cmpi.l #$109,d0
bcs SCALL_EE * CDC.xのバージョンがふるい
move.l d1,-(sp)
moveq #-1,d1
CDC _CDC_POWER
move.l (sp)+,d1
tst.l d0
beq SCALL_EE * CDC.xが停止している
CDC _CDC_SCSIID
move.l d0,ID * ID にセット
move.l #_SCSIDRV,d0
@@:
cmpi.w #_S_SELECT,d1 * _S_SELECTならd4を記憶
bne @f * _S_CMDOUT用にとっておく
move.l d4,IDBUP *
@@:
cmpi.w #_S_SELECTA,d1 * _S_SELECTAならd4を記憶
bne @f * _S_CMDOUT用にとっておく
move.l d4,IDBUP *
@@:
cmpi.w #_S_CMDOUT,d1 *
beq @f * _S_CMDOUT以外なら
cmp.w ID+2(pc),d4 * d4をチェック
bne SCALL_JMP * 対象ID以外ならオリジナルルーチンへ
bra 1f *
@@:
move.l IDBUP(pc),d0 * _S_CMDOUTなら _SELECTの時のd4控えと比較
cmp.w ID+2(pc),d0 * 対象ID以外ならオリジナルルーチンへ
bne SCALL_EE *
1:
movem.l d4/a1,-(sp)
**--- LUN確認! ---**
cmpi.w #_S_CMDOUT,d1 *
bne @f * _S_CMDOUT以外なら
move.l IDBUP(pc),d4 * _S_CMDOUTなら _SELECTの時のd4控えをつかう
@@:
move.l d4,d0
swap d0
tst.w d0
bne SCALL_EES * 既に LUNがある
**--- CDCチェック! ---**
_CDC_CHK_S
beq SCALL_EES * CDC.xが常駐していない
CDC _CDC_VERSION
cmpi.l #$109,d0
bcs SCALL_EES * CDC.xのバージョンがふるい
move.l d1,-(sp)
moveq #-1,d1
CDC _CDC_POWER
move.l (sp)+,d1
tst.l d0
beq SCALL_EES * CDC.xが停止している
CDC _CDC_SCSIID
cmp.w d0,d4
bne SCALL_EES * CDC.x管理と今のドライブがちがうID
**--- CDC の LUN を使う ---**
move.l d0,d4 * CDC_SCSIIDの戻り値を使う
**--- 前回のLUNと比べる ---**
cmp.l STCID(pc),d4
beq @f
move.l d4,STCID
CDC _CDC_EJEEMU * 違うならイジェクトされていたことにする
@@:
**--- LUN変更 ---**
cmpi.w #_S_CMDOUT,d1 * _S_CMDOUT以外ならd4をいじるだけ
bne SCALL_L1
**--- LUN変更 及び [_S_CMDOUT]LUN対応対策 ---**
move.b (a1),d0
andi.b #$E0,d0 * CMDの長さを調べる!
bne @f
moveq #6-1,d0 * グループ0 6byte
bra 1f
@@: rol.b #3,d0
cmpi.b #3,d0
bcc @f
moveq #10-1,d0 * グループ1,2 10byte
bra 1f
@@: cmpi.b #5,d0
bne @f
moveq #12-1,d0 * グループ5 12byte
bra 1f
@@: * グループ(4,5),6,7
move.l d3,d0 * これらはd3で決められている
subq.w #1,d0
1:
move.l a2,-(sp)
lea CMDBUP(pc),a2 *
@@: move.b (a1)+,(a2)+ * 命令を書き替えるので一度コピー
dbra d0,@b *
movea.l (sp)+,a2
lea CMDBUP(pc),a1 * こっちの命令ブロックを渡す
andi.b #%0001_1111,1(a1)
swap d4
lsl.w #5,d4
or.b d4,1(a1) * LUNフィールドにLUNを書き込む
*bra SCALL_L1
SCALL_L1: **--- オリジナル IOCS ROUTINE 同等 ---**
bsr SCALL_EE
movem.l (sp)+,d4/a1
rts
SCALL_EES:: **--- オリジナル IOCS ROUTINE へ ---**
movem.l (sp)+,d4/a1
SCALL_EE:: **--- オリジナル IOCS ROUTINE へ ---**
move.l #_SCSIDRV,d0
SCALL_JMP::
move.l SCALL_JPT(pc),-(sp)
rts
SCALL_JPT:
.dc.l 0
CMDBUP: .ds.b 128
STCID: .dc.l -1 *前のLUN,ID
IDBUP: .dc.l 0 *最後のSELECT時のID
*-------------------------*
__COM__:
ID:
.dc.l -1 * 対応ID
StaMod:
.dc.b 0
.even
__COM__S:
EndStatio:*******************常駐部
ETYP_KEEP:*----------------------------------------
**常駐!
move.l #EndStatio,$e(a5)
Print CRLF(pc)
Print LR1(pc)
bsr keepdisp
Print LR2(pc)
move.b #-1,StaMod
moveq.l #$00,d0
rts
MarkerChk:*----------------------------------------
* a0 アドレス
*
*[戻り値] bne ちがう
* beq あっている
cmpa.l #$00F00000,a0
bcc @f
cmp.l #HEAD1,(a0)
bne @f
cmp.l #HEAD2,4(a0)
bne @f
cmpa.l a0,a0 *z=1
@@:
rts
InvChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l (a0),a0 *一つ前のポインタ
cmpa.l #$00F00000,a0
bcc IC1
cmp.l #HEAD1,$0100+(head-SS)(a0)
bne @f
cmp.l #HEAD2,$0104+(head-SS)(a0)
bne @f
adda.l #$100,a0 **[SS]のポインタ
rts
@@: **違う
tst.l (a0) *一つ前のポインタ
bne InvChk *0でない(上へ)
IC1: sub.l a0,a0 *非常駐
rts
DevChk:*----------------------------------------
* a0.l==なら非常駐
* a0.l!=なら常駐
movea.l #$6800,a0
DC1: cmp.l #'NUL ',(a0)
bne @f
cmp.l #' ',4(a0)
bne @f
bra DC4
@@:
addq.l #2,a0
bra DC1 *絶対あるはず。。
DC4:
move.l d0,-(sp)
suba.l #(dhead-SS),a0 *リンクポインタ
DC2: movea.l (a0),a0
move.l a0,d0
bmi DC3
cmp.l #HEAD1,(dhead-SS)(a0)
bne DC2
cmp.l #HEAD2,(dhead-SS)+4(a0)
bne DC2
cmp.l #HEAD1,(head-SS)(a0)
bne DC2
cmp.l #HEAD2,(head-SS)+4(a0)
bne DC2
*あった
move.l (sp)+,d0
rts
DC3:
move.l (sp)+,d0
sub.l a0,a0 *非常駐
rts
.if 0
AtoI:*----------------------------------------
* a2 アドレス
*[戻り値] d0.l 数字
moveq #0,d0
move.b (a2),d2
cmpi.b #'$',d2
jbeq AtoHI
@@: move.b (a2)+,d2
subi.b #'0',d2
jbcs AIr
cmpi.b #9,d2
jbhi AIr
andi.l #$0000FF,d2
mulu #10,d0
add.l d2,d0
jbra @b
AIr: subq #1,a2
rts
AtoHI:
*(Hex専用)
move.b (a2)+,d2 *$ skip
@@: move.b (a2)+,d2
subi.b #'0',d2
jbcs AHIL1
cmpi.b #9,d2
jbhi AHIL1
lsl.l #4,d0
add.l d2,d0
jbra @b
AHIL1:
ori.b #$20,d2
subi.b #'a'-'0',d2
jbcs AHIL2
cmpi.b #5,d2
jbhi AHIL2
lsl.l #4,d0
addi.l #10,d0
add.l d2,d0
jbra @b
AHIL2: subq #1,a2
rts
.endif
init:*------------------------------------------------------------------
Print LR1(pc)
** 常駐チェック **
suba.l a1,a1
SUPER
movea.l d0,a1
moveq #0,d1
bsr InvChk
move.l a0,d0
bne @f
bsr DevChk
@@: movea.l a0,a3 *常駐先頭アドレス
movea.l SCALL_,a0
suba.l #SCALL-head,a0
bsr MarkerChk
bne @f
bset #0,d1
@@:
*d1に常駐状態
USER
** 常駐していたらそのデータを引用 **
move.l a3,d0
beq conl
suba.l a1,a1
SUPER
movea.l d0,a1
* move.w proc-SS(a3),proc
* move.l _SFTK-SS(a3),_SFTK
* move.b _TRGK-SS(a3),_TRGK
move.b StaMod-SS(a3),StaMod
USER
conl: ** コマンドラインチェック **
tst.b (a2)+ *スキップ
sw: move.b (a2)+,d0
beq keep
cmpi.b #' ',d0
beq sw
cmpi.b #$09,d0 *tab
beq sw
cmpi.b #'-',d0
beq swc
cmpi.b #'/',d0
beq swc
swe: pea LR6(pc)
bra PE *end
swc: **スイッチ判断
move.b (a2)+,d0
beq swe
cmpi.b #'?',d0
beq help
ori.b #$20,d0 *小文字化!
cmpi.b #'r',d0
beq free
cmpi.b #'h',d0
beq help
pea LR7(pc)
bra PE *end
help:
pea LRH(pc)
bra PE *end
keep: ************************** 常駐させる
move.l a3,d0
beq keepL1
*既に常駐、設定変更
* suba.l a1,a1
* SUPER
* movea.l d0,a1
* move.l _SFTK(pc),_SFTK-SS(a3)
* move.b _TRGK(pc),_TRGK-SS(a3)
* USER
move.w MC(pc),d0
bne @f
pea LR5(pc)
bra PE *end
@@: pea LR5_(pc)
bra PE *end
keepL1:
**セット
suba.l a1,a1
SUPER
movea.l d0,a1
bsr keepdisp
USER
Print LR2(pc)
Print LRKP(pc)
clr.w -(sp)
move.l #EndStatio-StartStatio,-(sp)
DOS _KEEPPR
keepdisp:***************
lea SCALL_JPT(pc),a0
move.l SCALL_,(a0)
lea SCALL(pc),a0
move.l a0,SCALL_
rts
free: *****************************常駐解除
move.l a3,d0
bne @f
pea LR8(pc) **非常駐
bra PE *end
@@:
tst.b StaMod
beq @f
pea LRCN(pc) **CONFIG常駐
bra PE *end
@@:
cmpi.w #$01,d1
beq @f
pea LR4(pc) **ベクタが占領
bra PE *end
@@:
suba.l a1,a1
SUPER
movea.l d0,a1
move.l (SCALL_JPT-SS)(a3),SCALL_
USER
sub.l #$00000F0,a3
move.l a3,-(sp)
DOS _MFREE
addq.l #4,sp
pea LR3(pc)
PE: DOS _PRINT
addq.l #4,sp
DOS _EXIT
MC: .dc.w 0 *モードをいじった
LR2: .dc.b ' CD-ROM の LUN(TRAY) を CDC.x で管理します。',$0d,$0a,0
LRKP: .dc.b ' 常駐しました。',$0d,$0a,0
LR3: .dc.b ' 常駐解除しました。',$0d,$0a,0
LR4: .dc.b ' ベクタが占領されています。',$0d,$0a,0
LR5: .dc.b ' 既に常駐しています。',$0d,$0a,0
LR5_: .dc.b ' 設定を変更しました。 ',$0d,$0a,0
LR6: .dc.b ' コマンドラインが異常です。',$0d,$0a,0
LR7: .dc.b ' スイッチが異常です。',$0d,$0a,0
LR8: .dc.b ' 常駐していません。',$0d,$0a,0
LRCN: .dc.b ' CONFIG.SYSで登録されています。',$0d,$0a
.dc.b ' 常駐解除できません。',$0d,$0a,0
.even
LRH: .dc.b $0d,$0a
.dc.b '使用法:CDCLUN.x [switch]',$0d,$0a
.dc.b ' /R ・・・・・・・・ 常駐解除します。',$0d,$0a
.dc.b $0d,$0a
.dc.b ' CD-ROM の LUN(TRAY) を CDC.x で管理します。',$0d,$0a,0
.dc.b $0d,$0a
.dc.b 0
.even
LR1: .dc.b 'X68k 多連装CD-ROM LUN DRIVER with CDC.x Version 0.60 Copyright 1996 TNB製作所'
CRLF: .dc.b $0d,$0a,0
.even
.end init